from sqlalchemy import create_engine, and_, or_
from sqlalchemy.orm import sessionmaker
from model import User

# 1. 链接数据库等准备工作
engine = create_engine('mysql+pymysql://root:python@localhost:3306/19python')
DBSession = sessionmaker(bind=engine)
session = DBSession()

# 2. 查询数据

# 条件查询
print("--------------1-----------")
user = session.query(User).filter(User.id == 1).one()  # 查询所有是all()，一个是one()
print(user.id, user.username, user.email, user.address)

# 查询第1个
print("--------------2-----------")
ret = session.query(User).filter(User.id == 4).first()  # 如果没有，不会产线异常，而是返回值为None
print(ret)
# session.query(User).filter(User.id == 4).one()  # 如果没有，会产生异常

# 根据条件查询指定的字段
print("--------------3-----------")
users = session.query(User.username, User.email).filter(User.id >= 1).all()
print(users)

# 通过索引取出数据
print("--------------4-----------")
users = session.query(User.username).all()[0:2]  # 取下标为0、1 不包括2，很类似切片
print(users)

# 根据id升序排列
print("--------------5-----------")
# users = session.query(User).order_by(User.id).all()  # 按照id从小到大
# users = session.query(User).order_by(-User.id).all()  # 按照id从大到小
users = session.query(User).order_by(User.email).order_by(-User.id).all()  # 先按email从小到大排序，如果相同则按照id从大到小排序
for x in users:
    print(x.id, x.username, x.email)

# 查询user表中id是1,3,4的姓名
print("--------------6-----------")
users = session.query(User.username).filter(User.id.in_([1, 3, 4])).all()
for temp in users:
    print(temp.username)

# 模糊查询,%匹配多个字符,_匹配单个字符
print("--------------7-----------")
users = session.query(User.username).filter(User.email.like('xxxxxxx_@%')).all()  # _表示任意字符 %表示任意多个
for temp in users:
    print(temp.username)

# 计算个数,返回查询的数量
print("--------------8-----------")
users_num = session.query(User).count()
print(users_num)

# 逻辑与
print("--------------9-----------")
users = session.query(User.username).filter(and_(User.id >= 4, User.username.like('%a%'))).all()
for temp in users:
    print(temp.username)

# 逻辑或查询
print("--------------10-----------")
obj = session.query(User).filter(or_(User.id == 1, User.email.like('xxxxxxx_@%'))).all()
for temp in obj:
    print(temp.username)

# 4. 关闭session
session.close()
